package opf5.ui;

import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import opf5.casosDeUso.InscripcionDTO;
import opf5.casosDeUso.InscriptorPartidos;
import opf5.casosDeUso.LoginDependiente;
import opf5.casosDeUso.PartidoDTO;
import opf5.entities.condicionesInscripcion.CondicionNula;
import opf5.entities.dominio.Inscripcion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.excepciones.OperacionNoPermitidaException;
import opf5.entities.inscripciones.CondicionDeInscripcion;
import opf5.entities.inscripciones.InscripcionEstandar;
import opf5.entities.inscripciones.InscripcionSolidaria;
import opf5.entities.repositorios.OPF5Factory;
import opf5.entities.repositorios.RepositorioPartidos;

import javax.swing.DefaultComboBoxModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JTable;

public class VistaInscripcionPartido extends LoginDependiente {
	private JFrame frame;
	private OPF5TablaPartidos tablaPartidos;
	private OPF5TablaJugadores tablaJugadores;
	private List<Partido> partidos;
	JComboBox comboBox;
	private Partido partidoElegido;
	private JLabel lblCondicional;
	private JLabel lblSolidaria;
	private JLabel lblEstandar;
	private RepositorioPartidos repositorioPartidos;
	private VistaCondicionesInscripcion vistaCondicionesInscripcion = new VistaCondicionesInscripcion();
	private CondicionDeInscripcion condicion;
	
	public VistaInscripcionPartido(RepositorioPartidos repositorioPartidos) {
		this.repositorioPartidos = repositorioPartidos;
	}
	
	/**
	 * Initialize the contents of the frame.
	 * @wbp.parser.entryPoint
	 */
	public void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 730, 364);
		frame.getContentPane().setLayout(null);
		
		JLabel lblI = new JLabel("Inscribirse a Partido");
		lblI.setBounds(12, 12, 156, 15);
		frame.getContentPane().add(lblI);

		tablaPartidos = new OPF5TablaPartidos(new String[] {
				"Fecha", "Lugar", "Inscriptos"
		});
		tablaPartidos.setBounds(22, 39, 398, 198);
		frame.getContentPane().add(tablaPartidos);
	
		ListSelectionModel listSelectionModel = tablaPartidos.table.getSelectionModel();
	    listSelectionModel.addListSelectionListener(new ListSelectionListener() {
			@Override
			public void valueChanged(ListSelectionEvent arg0) {
				cargarJugadores();
				cargarInscripciones();
			} 	
	    });
		
		tablaJugadores = new OPF5TablaJugadores();
		tablaJugadores.setBounds(430, 39, 274, 197);
		frame.getContentPane().add(tablaJugadores);
		
		
		
		comboBox = new JComboBox();
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runVerificarCondicional();
			}
		});
		comboBox.setModel(new DefaultComboBoxModel(new String[] {"Estandar", "Solidaria", "Condicional"}));
		comboBox.setBounds(575, 247, 129, 24);
		frame.getContentPane().add(comboBox);
		
		JLabel lblTipoDeInscripcion = new JLabel("Tipo de inscripcion");
		lblTipoDeInscripcion.setBounds(430, 252, 129, 15);
		frame.getContentPane().add(lblTipoDeInscripcion);
		
		JButton btnInscribirme = new JButton("Inscribirme");
		btnInscribirme.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				realizarInscripcion();
			}
		});
		btnInscribirme.setBounds(587, 292, 117, 25);
		frame.getContentPane().add(btnInscribirme);
		
		JLabel lblInscripcionesEstandar = new JLabel("Inscripciones Estandar:");
		lblInscripcionesEstandar.setBounds(32, 249, 233, 15);
		frame.getContentPane().add(lblInscripcionesEstandar);
		
		JLabel lblInscripcionesSolidarias = new JLabel("Inscripciones Solidarias:");
		lblInscripcionesSolidarias.setBounds(32, 276, 233, 15);
		frame.getContentPane().add(lblInscripcionesSolidarias);
		
		JLabel lblInscripcionesCondicionales = new JLabel("Inscripciones Condicionales:");
		lblInscripcionesCondicionales.setBounds(32, 303, 233, 15);
		frame.getContentPane().add(lblInscripcionesCondicionales);
		
		lblEstandar = new JLabel("");
		lblEstandar.setBounds(277, 249, 70, 15);
		frame.getContentPane().add(lblEstandar);
		
		lblSolidaria = new JLabel("");
		lblSolidaria.setBounds(277, 276, 70, 15);
		frame.getContentPane().add(lblSolidaria);
		
		lblCondicional = new JLabel("");
		lblCondicional.setBounds(277, 303, 70, 15);
		frame.getContentPane().add(lblCondicional);
		
		this.cargarPartidos();
		
		
		
		final VistaInscripcionPartido window = this;
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	protected void runVerificarCondicional() {
		if (this.comboBox.getSelectedIndex() == 2) {
			this.vistaCondicionesInscripcion.initialize(this);
		}
		
	}

	protected void cargarInscripciones() {
		int estandar = 0;
		int solidaria = 0;
		int condicional = 0;
		for (Inscripcion i : partidoElegido.getInscripciones()) {
			if (i.toString().equals("Estandar"))
				estandar ++;
			else if (i.toString().equals("Solidaria"))
				solidaria ++;
			else
				condicional ++;
		}
		
		lblEstandar.setText(Integer.toString(estandar));
		lblSolidaria.setText(Integer.toString(solidaria));
		lblCondicional.setText(Integer.toString(condicional));
	}

	protected void realizarInscripcion() {
		if (validarSeleccion()) {
			try {
				this.partidoElegido.inscribir(getInscripcion());
				this.cargarPartidos();
				JOptionPane.showMessageDialog(frame, "Inscripcion satisfactoria.");
			} catch (OperacionNoPermitidaException e) {
				JOptionPane.showMessageDialog(frame, e.mensaje);
			}
		} else {
			JOptionPane.showMessageDialog(frame, "Debe elegir un partido");
		}
	}

	private Inscripcion getInscripcion() {
		switch(this.comboBox.getSelectedIndex()) {
		case 0:
			return OPF5Factory.getInstance().makeInscripcionEstandar(jugador);
		case 1:
			return OPF5Factory.getInstance().makeInscripcionSolidaria(jugador);
		}
		
		if (this.condicion == null)
			this.condicion = new CondicionNula();
		
		return OPF5Factory.getInstance().makeInscripcionCondicional(jugador, this.condicion);
	}

	private boolean validarSeleccion() {
		return tablaPartidos.getIndice() >= 0;
	}

	protected void cargarJugadores() {
		if (! validarSeleccion()) {return;}
		int indice = tablaPartidos.getIndice();
		partidoElegido = partidos.get(indice);
		tablaJugadores.cargarJugadoresModelo(getJugadores());
	}

	private List<Jugador> getJugadores() {
		List<Jugador> jugadores = new ArrayList<Jugador>();
		for (Inscripcion i : partidoElegido.getInscripciones()) {
			jugadores.add(i.getJugador());
		}
		return jugadores;
	}

	private void cargarPartidos() {
		partidos = this.repositorioPartidos.getPartidosDisponiblesPara(this.jugador);
		tablaPartidos.cargarPartidosModelo(partidos);
		tablaJugadores.limpiar();
		lblCondicional.setText("");
		lblEstandar.setText("");
		lblSolidaria.setText("");
	}

	public int getIndicePartido() {
		return tablaPartidos.getIndice();
	}

	public String getTipoInscripcion() {
		return comboBox.getModel().getSelectedItem().toString();
	}

	public void setCondicion(CondicionDeInscripcion condicion) {
		this.condicion = condicion;
	}
}
